package d1_midterm_examination.d1_firstquestion;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class OkTest02 {
    public static void main(String[] args) {
        //目标:完成幸存者案例
        //利用传统思维,进行做
        //1、定义一个集合ArrayList<> 存储100名囚犯
        List<Integer> peoples = new ArrayList<>();

        //4、创建一个随机数对象
        Random r = new Random();
        //2、依次存入100个1-200的随机的不重复的编号到集合中去
        for (int i = 0; i < 100; i++) {
            //3、开始生成随机的编号-->到这里该创建随机数对象了
            int code = r.nextInt(200) + 1;
            //4、判断集合中是否已经存在这个编号
            if (peoples.contains(code)) {
                //进入到这里,证明编号已经是存在了
                --i;//重新为当前位置生成一个编号
            } else {
                //到这里编号就是不存在的,添加到集合中去
                peoples.add(code);
            }
        }

        //10、创建一个集合,用于复制一份集合,用于计算幸存囚犯第一次出现的位置
        List<Integer> people = new ArrayList<>();
        //注意: 不要直接复制, 不然就是操作同一个集合
        people.addAll(peoples);//要数据的集合调用这个方法,参数是要倒数据过去的集合


        //5、输出集合,展示阶段结果
        System.out.println(peoples);

        //6、删除奇数位置处的囚犯-->注意: 不要前面开始删除-->否则就很麻烦了--->一删除集合,全部元素的位置都会变化
        //要反复删除-->直到剩下最后一个
        while (peoples.size() > 1) {
            //从后面开始删
            //7、推敲位置
            //不许分这两种情况-->否则报错-->一删除,后面的偶数会向前挪,可能会删除偶数位置
            //peoples[1 2 3 4 5 6]
            //                i
            //peoples[1 2 3 4 5]
            //                i
            for (int i = peoples.size() % 2 == 0 ? peoples.size() - 2 : peoples.size() - 1; i >= 0; i -= 2) {
                peoples.remove(i);
            }
        }

        //8、可以获取结果-->最后幸存的囚犯
        int code = peoples.get(0);
        System.out.println("幸存囚犯的编号" + code);

        //9、还要获取囚犯第一次的站位
        int index = people.indexOf(code);
        System.out.println("幸存囚犯第一次站位:" + (index + 1));
    }
}
